import json
#from src.sys_prompt import *
from func.gobal.data import LLmData
from openai import OpenAI
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor
from func.log.default_log import DefaultLog
from func.search.search_core import SearchCore
from func.translate.baidu_translate import BaiduTranslate
import threading
import re

REVIEW_PROMPT= """

请根据以下输入内容，生成多个文件的横向对比表格：

每个输入的文件信息包含以下评分和内容：
1. **Content Quality (30 points)**：
   - Coverage（覆盖度）得分
   - Structure（结构）得分
   - Relevance（相关性）得分
   - Subtotal（小计）得分

2. **Citation Quality (30 points)**：
   - Citation Recall（引用召回）得分
   - Citation Precision（引用精确度）得分
   - Citation Count（引用数量）得分
   - Subtotal（小计）得分

3. **Total Score（总评分）**
   - Total（总分）

4. **Subjective Evaluation（主观评价）**：
   - Strengths（优点）
   - Areas for Improvement（改进空间）

5. **Recommendations（建议）**
   - 评审人员给出的改进建议。

6. **Statistics（统计信息）**：
   - Topic（主题）
   - Total characters（总字数）
   - Total chapters（总章数）
   - Total subsections（总子章节数）
   - Total references in-text（文中引用数）
   - Total references listed（引用列表数）

### 输出要求：
1. **文件名**：每个文件的名称
2. **内容质量得分**（包括Coverage、Structure、Relevance三个子项的得分）
3. **引用质量得分**（包括Citation Recall、Citation Precision、Citation Count三个子项的得分）
4. **总评分**（Total）
5. **概要信息**：
    - 字数（Total characters）
    - 章节数（Total chapters）
    - 子章节数（Total subsections）
    - 文内引用数（Total references in-text）
    - 引用列表数（Total references listed）
6. **综合评判**：
    - 根据每个文件的评分（包括内容质量得分、引用质量得分以及各个分项得分）和每个文件的主观评价，建议等文字信息的内容，综合判断哪个文件的质量最好，并给出这个文件质量较好的具体原因。
    - 最高质量文件的Subjective Evaluation（主观评价）
    - 最高质量文件的Suggestion（改进建议）
    - **特殊情况说明需覆盖所有分项**：如果最高分文件在**任意子项（如Coverage、Citation Recall等）**的得分低于其他文件，需逐一列出所有其他文件的名称，该分项得分，以及并说明原因。   


### 输出格式：
请按照以下Markdown格式生成输出表格：

#### 1. 内容质量得分：
| 文件名     | Coverage | Structure | Relevance | Content Quality Subtotal |
|------------|----------|-----------|-----------|---------------------------|
| 文件名1    | 得分     | 得分      | 得分      | 小计                      |
| 文件名2    | 得分     | 得分      | 得分      | 小计                      |

#### 2. 引用质量得分：
| 文件名     | Citation Recall | Citation Precision | Citation Count | Citation Quality Subtotal |
|------------|-----------------|--------------------|----------------|---------------------------|
| 文件名1    | 得分            | 得分               | 得分           | 小计                      |
| 文件名2    | 得分            | 得分               | 得分           | 小计                      |

#### 3. 概要信息：
| 文件名     | Total Score | Total Characters | Total Chapters | Total Subsections | Total References in-text | Total References Listed |
|------------|-------------|------------------|----------------|-------------------|--------------------------|--------------------------|
| 文件名1    | 总分        | 字数             | 章节数         | 子章节数          | 引用数                   | 引用列表数               |
| 文件名2    | 总分        | 字数             | 章节数         | 子章节数          | 引用数                   | 引用列表数               |

#### **综合评判**
1. 质量最高的文件
   - **最佳文件名称**: 文件A
   - 总评分: 85/100
   - 质量最好的具体原因: 文件A在内容覆盖度、结构合理性、引用精确度等方面表现优异，整体信息完整，引用的文献质量较高，内容质量评分和引用质量评分均为最高。

2. 最高质量文件的主观评价
   - Strengths（优点）: xxx。
   - Areas for Improvement（改进空间）: xxx

3. 最高质量文件的改进建议
   - 建议（Suggestions）: xxx。

4. **特殊情况说明**
   - **文件名称**: **文件B**    
   - **分项名称**: **Citation Recall（引用召回）**
   - **较高得分**: **28/30**
   - 最高质量文件（文件A）在该分项的得分: 26/30
   - 为什么该分项文件B比文件A得分更高: 文件B的引用覆盖面更广，涉及的参考文献较全面。
   - 为什么文件A仍然是质量最高的文件: 尽管文件B的引用召回率较高，但其引用的精确度较低（仅为22/30），而文件A的引用精确度达到27/30，保证了引用质量的可靠性。因此，文件A在整体引用质量上更胜一筹，同时在内容质量方面表现更优秀，因此仍然是综合质量最好的文件。

   - **文件名称**:    
   - **分项名称**: 
   - **较高得分**: 
   - 最高质量文件（文件A）在该分项的得分: 26/30
   - 为什么该分项文件B比文件A得分更高: 
   - 为什么文件A仍然是质量最高的文件: 
   
"""

class LiteratureReviewer:
    def __init__(self):
        llmData = LLmData()
        self.logger = DefaultLog().getLogger()
        self.glm_client = OpenAI(api_key=llmData.api_key, base_url=llmData.base_url)
        self.model_name = llmData.model_name
        self.baiduTranslate = BaiduTranslate()
        self.searchCore = SearchCore()

    def call_openai(self, query, model_name ="", system_prompt=REVIEW_PROMPT, json_format=False):
        model_name = self.model_name
        if system_prompt is not None:
            messages = [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": query}
            ]
        else:
            messages = [
                {"role": "user", "content": query}
            ]
        if json_format:
            response_format={"type": "json_object"}
        else:
            response_format={"type": "text"}
        try:
            response = self.glm_client.chat.completions.create(
                model=model_name,
                messages=messages,
                temperature=0.1,
                response_format=response_format
            )
            return response.choices[0].message.content
        except Exception as e:
            print(f"调用API时发生错误: {str(e)}")
            return ""
        
